package cn.jly.bigdata.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author lanyangji
 * @date 2019/11/24 10:47
 */
object Spark02_expr9 {

  def main(args: Array[String]): Unit = {

    // local模式

    // 创建 SparkConf 对象
    // 这边也自定义了本地的模式（分配多少个cpu）
    // app id
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("wordCount")

    // 创建spark上下文对象，SparkContext -> sc
    val sc = new SparkContext(sparkConf)

    val listRDD: RDD[Int] = sc.makeRDD(1 to 16, 4)

    // 先打印下数据
    listRDD.saveAsTextFile("output")

    // 先查看分区数
    val partitions = listRDD.getNumPartitions
    println(s"partitions = $partitions")  // 4
    println(s"partitions = ${listRDD.partitions.length}")  // 4

    // coalesce算子，用于缩减分区数，用于大数据集过滤后，提高小数据集的执行效率
    // 这里的缩减分区，可以简单理解成合并分区，没有shuffle过程
    val coalesceRDD: RDD[Int] = listRDD.coalesce(3)
    // 默认是不进行shuffle的，你也可以选择进行shuffle
    //val coalesceRDD: RDD[Int] = listRDD.coalesce(3, shuffle = true)
    // 如果设置的分区数大于等于之前的分区数，则不变
    //val coalesceRDD: RDD[Int] = listRDD.coalesce(5)

    println(s"partitions = ${coalesceRDD.partitions.length}")  // 3

    coalesceRDD.saveAsTextFile("output1")
  }
}
